package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * IO流---传对象---高级流
 * ObjectOutputStream    对象输出流---传Persion.java对象---写操作
 * ObjectInputStream     对象输入流---传Persion.java对象---读操作
 */
public class ObjectIO {
    /**
     * ObjectOutputStream  对象输出流
     * 使用方法：1.创建实现序列化接口的对象
     *         2.对象输出流---XXX.obj文件
     *                      传输对象，指定格式obj
     *
     */
    @Test
    public void testOOS() throws IOException {
        //1.创建Persion对象
       Persion p=new Persion();
       p.setName("王培贤");
       //数组--动态数组
        // String[] str={"1" "2" "3"};静态/动态数组
        // String[] str=new String [] {"1"}
       p.setSay(new String[]{"嘻嘻"});
       System.out.println("打印对象："+p);

       //对象输出写出文件      xxx.obj    Persion.java
        FileOutputStream fos=new FileOutputStream("persion.obj");
        ObjectOutputStream oos=new ObjectOutputStream(fos);
        /**
         * writeObject(Object obj)     ----理解：写出对象
         *该方法会将给定对象按照其结构进行转换
         * 转换为一组字节，在通过其处理的流写出
         *
         * 写出文件专业术语
         * 1.通过对象输出流Persion类，先转换为一组“组”字节，这个过程【对序列化】
         * 2.将序列化后的字节在通过字节流【低级流】写入文件中【硬盘上】做长久保存，这个过程【数据持久化】
         *   将persion.obj持久化保存硬盘上
         *
         */
         oos.writeObject(p);
        System.out.println("写出成功");

    }

    /**
     * ObjectInputStream   对象输入流
     * 序列化：将对象转化成二进制
     * 反序列化：二进制转换为对象
     * readObject()  返回读取的对象【？】
     * 需求：将序列化persion.bbj文件 按照对象方式读入
     *
     */
    @Test
    public void testOIS() throws IOException, ClassNotFoundException {
       //创建低级流
        FileInputStream fis=new FileInputStream("persion.obj");
        //创建高级流---对象读入
        ObjectInputStream ois=new ObjectInputStream(fis);
        //readObject()  获取对象【反序列化操作：二进制转换为对象】
        System.out.println(ois.readObject());
        System.out.println("反序列化成功！");

    }
}
